/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package principal;

import auxiliares.Equi2Rect;
import auxiliares.Server;
import auxiliares.TreeStreet;
import business.Panorama;
import business.XML;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import plot.PlotIntegration;
import support.Ponto;
import support.Triangulacao;

/**
 *
 * @author jonas
 */
public class Principal {
     
    /*
     * PROCESSO
     * Recebe as coordenadas
     * Busca XML
     * Cria o panorama raiz (na forma cubica)
     * Cria arvore com panorama Raiz
     * Realiza busca em largura pela arvore, usando o ASIF pra retornar o vencedor e vice
     * Realiza triangulacao para calcular a intersecao das retas dos panoramas vencedores
     * Deletar arquivos temporarios
     */
    
    public void doProcess(String lat, String lng) throws InterruptedException, IOException{
        
        String myXML = Server.getContentOfURL("http://cbk0.google.com/cbk?output=xml&ll=" + lat + "," + lng);
        String pano_idRaiz = XML.get_panoID(myXML);
        
        Equi2Rect.init();
        
        TreeStreet tree = new TreeStreet();
        tree.set_raiz(pano_idRaiz);
        tree.build(2);
        tree.init_breadth_search();
        
        Panorama winner = tree.getWinner();
        Panorama viceWinner = tree.getViceWinner();
        
        if(winner != null && viceWinner != null){
            winner.criaHistogramaPanorama();
            viceWinner.criaHistogramaPanorama();
            triangulacaoEPlot(tree.getListaPanoramas(), winner, viceWinner);
        } else {
            System.out.println("Nao encontrou dois vencedores");
            //continua busca na arvore ateh certo limite
        }
        
 
//        File dir = new File("temp");
//        dir.delete();
    }
    
    private void triangulacaoEPlot(ArrayList<Panorama> listaPanoramas, Panorama panoramaVencedor, Panorama panoramaVice){
        boolean vencedor;
        for(Panorama pano: listaPanoramas){
            String id = pano.get_pano_id();
            vencedor = id.equals(panoramaVencedor.get_pano_id()) || id.equals(panoramaVice.get_pano_id());
//            vencedor = pano.getHistograma() == null ? false : true;
            double grauComMaisMatches = pano.getHistograma() == null ? 0 : pano.getHistograma().getGrauComMaisMatches();
            PlotIntegration.save(id, pano.getLst_vizinhos(), pano.getLat(), pano.getLng(), grauComMaisMatches, vencedor);
        }
        
        Ponto pontoVencedor = new Ponto(panoramaVencedor.getLng(), panoramaVencedor.getLat());
        double anguloVencedor = panoramaVencedor.getHistograma().getGrauComMaisMatches();
        
        Ponto pontoViceVencedor = new Ponto(panoramaVice.getLng(), panoramaVice.getLat());
        double anguloViceVencedor = panoramaVice.getHistograma().getGrauComMaisMatches();
        
        Ponto alvo = Triangulacao.run(pontoVencedor, pontoViceVencedor, anguloVencedor, anguloViceVencedor);
        
        try{
             salvarLogTriangulacao(pontoVencedor, pontoViceVencedor, anguloVencedor, 
                anguloViceVencedor, alvo, panoramaVencedor.get_pano_id(), panoramaVice.get_pano_id());  
        } catch (Exception ex){
            ex.printStackTrace();
        }
        
        PlotIntegration.save("t", new ArrayList(), alvo.get_y(), alvo.get_x(), 0, true);
        
        PlotIntegration.createPlote();
    }
    
    private static void salvarLogTriangulacao(Ponto p1, Ponto p2, double a1, double a2, Ponto resultado, 
            String panoIdVencedor, String panoIdViceVencedor) throws IOException {
        File arq = new File("temp/Log_Triangulacao.txt");

        FileWriter fw = new FileWriter(arq);
        BufferedWriter bw = new BufferedWriter(fw);

        bw.write("Vencedor: " + panoIdVencedor);
        bw.newLine(); 
        bw.write("Lat = " + p1.get_y() + " Lng = " + p1.get_x());
        bw.newLine();  
        bw.write("Direcao: " + a1);
        bw.newLine();  
        bw.write("--------------");
        bw.newLine();  
        bw.write("ViceVencedor: " + panoIdViceVencedor);
        bw.newLine(); 
        bw.write("Lat = " + p2.get_y() + " Lng = " + p2.get_x());
        bw.newLine();  
        bw.write("Direcao: " + a2);
        bw.newLine(); 
        bw.write("--------------");
        bw.newLine();  
        bw.write("Resultado da triangulacao: Lat = " + resultado.get_y() + " Lng = " + resultado.get_x());
        bw.close();

    }
    
}
